/*****************************************************************************
**
**------------------------------------文件信息--------------------------------
** 文 件  名 称:
** 最后修改日期:2018-05-14
** 最后修改版本:V1.0
** 文件功能概述:
**
**-----------------------------------------------------------------------------
** 作        者:乔路阳
** 创 建  日 期:2016-10-13  
** 版        本:V1.0
** 简 要  概 述:
**
**-----------------------------------------------------------------------------
** 修   改   人:
** 修 改  日 期:       
** 修 改  版 本:
** 修 改  概 述:
** 审   核   人:
******************************************************************************/
#include "queue.h"

/*****************************************************************************
[函数名称]
[函数功能]
[参    数]无
[全局变量]无
[返 回 值]无
[备    注]
*****************************************************************************/
uint8_t Queue_Init(Queue_TypeDef* Queue_TypeStruct,uint8_t* p_buff,uint16_t size)
{
    Queue_TypeStruct->p_buff = p_buff;
    Queue_TypeStruct->buff_size = size;
    Queue_TypeStruct->startAddr = 0;
    Queue_TypeStruct->end_addr = 0;
    Queue_TypeStruct->buff_len = 0;
    return 0;
}

/*****************************************************************************
[函数名称]Queue_Add
[函数功能]向队列添加内容
[参    数]无
[全局变量]无
[返 回 值]无
[备    注]
*****************************************************************************/
uint8_t Queue_Add(Queue_TypeDef* Queue_TypeStruct,uint8_t* p_buff,uint16_t lenght)
{
    uint16_t i;
    if(lenght < (Queue_TypeStruct->buff_size - Queue_TypeStruct->buff_len))
    {
        for(i=0;i<lenght;i++)
        {
            Queue_TypeStruct->p_buff[Queue_TypeStruct->end_addr] = *p_buff++;
            Queue_TypeStruct->end_addr++;
            Queue_TypeStruct->end_addr = Queue_TypeStruct->end_addr % Queue_TypeStruct->buff_size;
        }
        __disable_irq();
        Queue_TypeStruct->buff_len += lenght;
        __enable_irq();
        return 0;
    }
    return 1;
}
/*****************************************************************************
[函数名称]Queue_GetLen
[函数功能]获取队列的长度
[参    数]无
[全局变量]无
[返 回 值]无
[备    注]
*****************************************************************************/
uint16_t Queue_GetLen(Queue_TypeDef* Queue_TypeStruct)
{
    uint16_t lenght = 0;
    lenght = Queue_TypeStruct->buff_len;
    
    return lenght;
}
/*****************************************************************************
[函数名称]Queue_GetData
[函数功能]获取队列中的某个数据
[参    数]    Queue_TypeStruct 操作的队列指针
            count   队列中第几个数据，数据值从1开始
[全局变量]无
[返 回 值] 数据值 或 0
[备    注]
*****************************************************************************/
uint8_t Queue_GetData(Queue_TypeDef* Queue_TypeStruct,uint16_t count)
{
    uint8_t u8data=0;
    if(count <= Queue_GetLen(Queue_TypeStruct))
    {
        u8data = Queue_TypeStruct->p_buff[(Queue_TypeStruct->startAddr + count - 1) % Queue_TypeStruct->buff_size];
    }
    return u8data;
}
/*****************************************************************************
[函数名称]Queue_GetDatas
[函数功能]从队列中将数据取出，并将数据从队列中删除
[参    数]    Queue_TypeStruct 操作的队列指针
            count   要取出的数据长度
[全局变量]无
[返 回 值] 取出的数据个数
[备    注]
*****************************************************************************/
uint16_t Queue_GetDatas(Queue_TypeDef* Queue_TypeStruct,uint8_t* p_buff,uint16_t lenght)
{
    uint16_t len = lenght;
    uint16_t i;
    
    //防止超界
    if(Queue_TypeStruct->buff_len < lenght)
    {
        len = Queue_TypeStruct->buff_len;
    }
    //取数据
    for(i=0;i<len;i++)
    {
        *p_buff++ = Queue_TypeStruct->p_buff[(Queue_TypeStruct->startAddr + i) % Queue_TypeStruct->buff_size];
    }
    //从队列中删除
    __disable_irq();
    Queue_TypeStruct->startAddr = (Queue_TypeStruct->startAddr + len) % (Queue_TypeStruct->buff_size);
    Queue_TypeStruct->buff_len = Queue_TypeStruct->buff_len - len;
    __enable_irq();
    
    return len;
}
/*****************************************************************************
[函数名称]Queue_Del
[函数功能]从队列中删除指定长度的数据
[参    数]无
[全局变量]无
[返 回 值]无
[备    注]
*****************************************************************************/
uint16_t Queue_Del(Queue_TypeDef* Queue_TypeStruct,uint16_t lenght)
{
    uint16_t len = lenght;
    //防止删除超界
    if(Queue_TypeStruct->buff_len < lenght)
    {
        len = Queue_TypeStruct->buff_len;
    }
    __disable_irq();
    Queue_TypeStruct->startAddr = (Queue_TypeStruct->startAddr + len) % (Queue_TypeStruct->buff_size);
    Queue_TypeStruct->buff_len = Queue_TypeStruct->buff_len - len;
    __enable_irq();
    return len;
}

/******************************************************************************
**  文件结束
******************************************************************************/
